// 修改request.js添加刷新令牌逻辑
import axios from "axios";
import { ElMessage, ElMessageBox } from "element-plus";
import { getToken, setAuthInfo, removeAuthInfo } from '@/utils/authStorage';
import router from '@/router';

// 创建axios实例117.72.73.114
const request = axios.create({
    baseURL: 'http://localhost:8080',
    timeout: 30000,
    headers: {
        'Content-Type': 'application/json;charset=utf-8'
    }
});

// 用于存储刷新令牌的请求实例（避免重复请求）
let refreshTokenRequest = null;

// 请求拦截器
request.interceptors.request.use(
    (config) => {
        // 添加访问令牌
        const token = getToken();
        if (token) {
            config.headers.Authorization = `Bearer ${token}`;
        }
        return config;
    },
    (error) => {
        return Promise.reject(error);
    }
);

// 响应拦截器
request.interceptors.response.use(
    (response) => {
        return response.data;
    },
     (error) => {
        const originalRequest = error.config;
        if (error.response?.status === 401 && !originalRequest._retry) {
            originalRequest._retry = true;
            try {
                const token = getToken();
                if (!token) {
                    throw new Error('没有访问令牌，需要重新登录');
                }

                // 2. 刷新请求无需传参（后端从Authorization头获取旧令牌）
                if (!refreshTokenRequest) {
                    refreshTokenRequest = request.post('/api/auth/token/refresh', {});
                }

                // 等待刷新结果
                const { data } =  refreshTokenRequest;
                if (data.code === 200 && data.data?.token) {
                    // 3. 只更新访问令牌（无需处理refreshToken）
                    setAuthInfo(
                        data.data.token,

                        {
                            userId: data.data.userId,
                            username: data.data.username,
                            role: data.data.role
                        },
                        localStorage.getItem('token') ? true : false // 保持原有存储方式
                    );
                    // 更新当前请求的令牌并重试
                    originalRequest.headers.Authorization = `Bearer ${data.data.token}`;
                    return request(originalRequest);
                } else {
                    throw new Error('刷新令牌失败');
                }
            } catch (refreshError) {
                // 刷新失败处理（保持不变）
                ElMessageBox.confirm(
                    '登录已过期，请重新登录',
                    '提示',
                    {
                        confirmButtonText: '登录',
                        cancelButtonText: '取消',
                        type: 'warning'
                    }
                ).then(() => {
                    removeAuthInfo();
                    router.push('/login');
                }).catch(() => {});

                return Promise.reject(refreshError);
            } finally {
                refreshTokenRequest = null;
            }
        }

        // 其他错误处理保持不变
        if (error.response) {
            switch (error.response.status) {
                case 403:
                    break;
                case 404:
                    ElMessage.error('请求的资源不存在');
                    break;
                case 500:
                    ElMessage.error('服务器内部错误');
                    break;
                default:
                    ElMessage.error(`请求错误：${error.response.status}`);
            }
        } else {
            ElMessage.error('网络错误，请稍后重试');
        }

        return Promise.reject(error);
    }
);


export default request;
